using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Features
{
    /// <summary>
    /// <para>Geodetic Densify</para>
    /// <para>Creates new features by replacing input feature's segments with densified approximations of geodesic segments. Four type of geodesic segments can be constructed: Geodesic, Great Elliptic, Loxodrome, and Normal Section.</para>
    /// <para>通过将输入要素的线段替换为测地线段的密集近似值来创建新要素。可以构造四种类型的测地线段：测地线段、大椭圆线段、轨迹线段和法线截面线段。</para>
    /// </summary>    
    [DisplayName("Geodetic Densify")]
    public class GeodeticDensify : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public GeodeticDensify()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Features</para>
        /// <para>The input line or polygon features.</para>
        /// <para>输入线或面要素。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The output feature class containing the densified geodesic features.</para>
        /// <para>包含密集化测地线要素的输出要素类。</para>
        /// </param>
        /// <param name="_geodetic_type">
        /// <para>Geodetic Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the type of geodetic segment to construct. Geodetic calculations are performed on the ellipsoid associated with the input data's coordinate system.</para>
        ///   <bulletList>
        ///     <bullet_item>Geodesic—The shortest distance between two points on the surface of the spheroid (ellipsoid).</bullet_item><para/>
        ///     <bullet_item>Loxodrome—The line of equal azimuth (from a pole) connecting the two points.</bullet_item><para/>
        ///     <bullet_item>Great elliptic— The line made by the intersection of a plane that contains the center of the spheroid and the two points.</bullet_item><para/>
        ///     <bullet_item>Normal section—The line made by the intersection of a plane that contains the center of the spheroid and is perpendicular to the surface at the first point.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要构造的大地测量线段的类型。大地测量计算是在与输入数据的坐标系关联的椭球体上执行的。</para>
        ///   <bulletList>
        ///     <bullet_item>测地线 - 椭球体（椭球体）表面上两点之间的最短距离。</bullet_item><para/>
        ///     <bullet_item>Loxodrome - 连接两点的相等方位角线（从极点开始）。</bullet_item><para/>
        ///     <bullet_item>大椭圆 （Great elliptic） - 由包含椭球体中心和两点的平面的交点组成的线。</bullet_item><para/>
        ///     <bullet_item>法线截面 - 由包含椭球体中心且在第一个点处垂直于曲面的平面的交点形成的线。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public GeodeticDensify(object _in_features, object _out_feature_class, _geodetic_type_value _geodetic_type)
        {
            this._in_features = _in_features;
            this._out_feature_class = _out_feature_class;
            this._geodetic_type = _geodetic_type;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Geodetic Densify";

        public override string CallName => "management.GeodeticDensify";

        public override List<string> AcceptEnvironments => ["extent", "outputCoordinateSystem", "outputMFlag", "outputZFlag", "outputZValue"];

        public override object[] ParameterInfo => [_in_features, _out_feature_class, _geodetic_type.GetGPValue(), _distance];

        /// <summary>
        /// <para>Input Features</para>
        /// <para>The input line or polygon features.</para>
        /// <para>输入线或面要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The output feature class containing the densified geodesic features.</para>
        /// <para>包含密集化测地线要素的输出要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Geodetic Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the type of geodetic segment to construct. Geodetic calculations are performed on the ellipsoid associated with the input data's coordinate system.</para>
        ///   <bulletList>
        ///     <bullet_item>Geodesic—The shortest distance between two points on the surface of the spheroid (ellipsoid).</bullet_item><para/>
        ///     <bullet_item>Loxodrome—The line of equal azimuth (from a pole) connecting the two points.</bullet_item><para/>
        ///     <bullet_item>Great elliptic— The line made by the intersection of a plane that contains the center of the spheroid and the two points.</bullet_item><para/>
        ///     <bullet_item>Normal section—The line made by the intersection of a plane that contains the center of the spheroid and is perpendicular to the surface at the first point.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要构造的大地测量线段的类型。大地测量计算是在与输入数据的坐标系关联的椭球体上执行的。</para>
        ///   <bulletList>
        ///     <bullet_item>测地线 - 椭球体（椭球体）表面上两点之间的最短距离。</bullet_item><para/>
        ///     <bullet_item>Loxodrome - 连接两点的相等方位角线（从极点开始）。</bullet_item><para/>
        ///     <bullet_item>大椭圆 （Great elliptic） - 由包含椭球体中心和两点的平面的交点组成的线。</bullet_item><para/>
        ///     <bullet_item>法线截面 - 由包含椭球体中心且在第一个点处垂直于曲面的平面的交点形成的线。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Geodetic Type")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _geodetic_type_value _geodetic_type { get; set; }

        public enum _geodetic_type_value
        {
            /// <summary>
            /// <para>Geodesic</para>
            /// <para>Geodesic—The shortest distance between two points on the surface of the spheroid (ellipsoid).</para>
            /// <para>测地线 - 椭球体（椭球体）表面上两点之间的最短距离。</para>
            /// </summary>
            [Description("Geodesic")]
            [GPEnumValue("GEODESIC")]
            _GEODESIC,

            /// <summary>
            /// <para>Loxodrome</para>
            /// <para>Loxodrome—The line of equal azimuth (from a pole) connecting the two points.</para>
            /// <para>Loxodrome - 连接两点的相等方位角线（从极点开始）。</para>
            /// </summary>
            [Description("Loxodrome")]
            [GPEnumValue("LOXODROME")]
            _LOXODROME,

            /// <summary>
            /// <para>Great elliptic</para>
            /// <para>Great elliptic— The line made by the intersection of a plane that contains the center of the spheroid and the two points.</para>
            /// <para>大椭圆 （Great elliptic） - 由包含椭球体中心和两点的平面的交点组成的线。</para>
            /// </summary>
            [Description("Great elliptic")]
            [GPEnumValue("GREAT_ELLIPTIC")]
            _GREAT_ELLIPTIC,

            /// <summary>
            /// <para>Normal section</para>
            /// <para>Normal section—The line made by the intersection of a plane that contains the center of the spheroid and is perpendicular to the surface at the first point.</para>
            /// <para>法线截面 - 由包含椭球体中心且在第一个点处垂直于曲面的平面的交点形成的线。</para>
            /// </summary>
            [Description("Normal section")]
            [GPEnumValue("NORMAL_SECTION")]
            _NORMAL_SECTION,

        }

        /// <summary>
        /// <para>Distance</para>
        /// <para>The distance between vertices along the output geodesic segment. The default value is 50 kilometers.</para>
        /// <para>沿输出测地线段的顶点之间的距离。默认值为 50 千米。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Distance")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public string _distance { get; set; } = "50 Kilometers";


        public GeodeticDensify SetEnv(object extent = null, object outputCoordinateSystem = null, object outputMFlag = null, object outputZFlag = null, object outputZValue = null)
        {
            base.SetEnv(extent: extent, outputCoordinateSystem: outputCoordinateSystem, outputMFlag: outputMFlag, outputZFlag: outputZFlag, outputZValue: outputZValue);
            return this;
        }

    }

}